package cbm.commons;

import java.lang.reflect.Field;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.Locale;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;

public class UtilitarioFunciones {
	
	public static char GS=(char)0x1d;
	public static char V=(char)0x56;
	public static char _c66=(char)0x42;
	public static char _c244=(char)0xf4;
	public static char _UNO=(char)0x1;
	public static char ESC=(char)0x1b;
	public static char FF=(char)0x0c;
	final static char ENTER = (char)0x0d;
	public static String SALTO_DE_LINEA = "\n\r";
	
	public static String getCabeceraPagina(){
		StringBuilder impresionTexto = new StringBuilder(); 
		impresionTexto.append(ESC+FF);		
		return impresionTexto.toString();
	}
	
	public static String getFinalPagina(){
		StringBuilder impresionTexto = new StringBuilder(); 
		impresionTexto.append(UtilitarioFunciones.SALTO_DE_LINEA);
		impresionTexto.append(UtilitarioFunciones.SALTO_DE_LINEA);
		impresionTexto.append(UtilitarioFunciones.SALTO_DE_LINEA);
		//impresionTexto.append(GS+V+_UNO+"");
		impresionTexto.append(UtilitarioFunciones.SALTO_DE_LINEA);
		return impresionTexto.toString();
	}
	
	public static String getString(String parametro){
		if(parametro==null){return null;}
		else if(parametro.equals("")){return null;}
		return parametro.toUpperCase();		
	}
	public static Double getDouble(String parametro) throws Exception{		
		parametro=obtenerValorParametroNumerico(parametro);
		if(parametro==null){return null;}
		else if(parametro.equals("")){return null;}		
		return Double.parseDouble(parametro);		
	} 
	public static Integer getInt(String parametro) throws Exception{
		if(parametro==null){return null;}
		else if(parametro.equals("")){return null;}		
		return Integer.parseInt(parametro);		
	}
	
	public static Integer getIntChek(String parametro) throws Exception{
		if(parametro==null||parametro.equals("")){return 0;}
		return (parametro.toUpperCase().equals("ON")?1:0);		
	} 
	
	
	
	public static String obtenerValorParametro(String parametro){
		if(parametro == null || parametro.trim().equals("") || parametro.trim().equals("-1") || parametro.trim().equals("null")){
			return null;
		}
		return parametro.trim().toUpperCase();
	}
	
	public static String obtenerValorParametroNumerico(String parametro){
		if(parametro == null || parametro.trim().equals("") || parametro.trim().equals("null")){
			return null;
		}
		if(parametro.indexOf(",")!=-1){
			parametro=parametro.replace(",", "");
		}
		return parametro.trim();
	}
	
	public static String mostrarResultado(String parametro){
		if(parametro == null){
			return " ";
		}
		return parametro.toUpperCase();
	}
	
	public static Date obtenerFechaActual(){
		Calendar fechaActual = Calendar.getInstance();
		return fechaActual.getTime();
	}
	
	public static String formatearFecha(Date fecha, String patron){
		String patronDefecto = "dd/mm/aaaa";
		SimpleDateFormat formato = null;
		if(patron==null){
			patron = patronDefecto;
		}
		formato = new SimpleDateFormat(patron);
		String fechaFormateada = formato.format(fecha);
		return fechaFormateada;
	}
	
	public static Date convertirFecha(String fecha) throws ParseException {
		SimpleDateFormat formato = new SimpleDateFormat(ConstantsWeb.PATRON_FECHA);
		Date objetoFecha = formato.parse(fecha);
		return objetoFecha;
	}
	public static String convertirFechaHoraFormato(Date fecha){
		SimpleDateFormat sdf=new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		return sdf.format(fecha);
	}

	public static java.sql.Timestamp getToDateSQL(Date date)throws Exception{
		java.sql.Timestamp fechaSQL=new Timestamp(date.getTime());	
		return fechaSQL;
	}
	
	public static Date getFechaInicio(String fecha)throws Exception{
		SimpleDateFormat sdf=new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		fecha+=" 00:00:00";
		return sdf.parse(fecha);
	}
	public static Date getFechaFin(String fecha)throws Exception{
		SimpleDateFormat sdf=new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		fecha+=" 23:59:59";
		return sdf.parse(fecha);
	}

	
	public static String getDate(String fecha,String pattern ){
		SimpleDateFormat sdf=new SimpleDateFormat(pattern);
		return sdf.format(fecha);
	}
	public static String toFormatDate(String fecha,String patternActual,String patternNuevo){
		try{
			SimpleDateFormat sdf=new SimpleDateFormat(patternActual);
			Date aux=sdf.parse(fecha);
			SimpleDateFormat sdf2=new SimpleDateFormat(patternNuevo);
			return sdf2.format(aux);
		}catch (Exception e) {
			return"";
		}
	}
	

	public static String formatearMontoNumerico(String numero) {
		if(numero == null) {
			return "";
		} else {
			numero = numero.replaceAll(",", "");
			//return String.format("%1$,.2f", numero);
			return new DecimalFormat("#,##0.00", new DecimalFormatSymbols(Locale.US)).format(Double.parseDouble(numero));
		}
	}
	public static String formatearMontoNumericoEntero(String numero) {
		if(numero == null) {
			return "";
		} else {
			//return String.format("%1$,.2f", numero);
			return new DecimalFormat("#,##0", new DecimalFormatSymbols(Locale.US)).format(Integer.parseInt(numero));
		}
	}
	
	public static String formatearCadenaXML(Double numero) {
		if(numero == null) {
			return "";
		} else {
			//return String.format("%1$,.2f", numero);
			return new DecimalFormat("###0.00", new DecimalFormatSymbols(Locale.US)).format(numero);
		}
	}
	
	public static String formatearMontoNumerico(Double numero) {
		if(numero == null) {
			return "";
		} else {
			//return String.format("%1$,.2f", numero);
			return new DecimalFormat("#,##0.00", new DecimalFormatSymbols(Locale.US)).format(numero);
		}
	}
	public static String formatearMontoNumerico(Double numero, Integer numeroDecimales) {
		if(numero == null) {
			return "";
		} else {
			return new DecimalFormat("#,##0."+StringUtils.repeat("0", numeroDecimales), new DecimalFormatSymbols(Locale.US)).format(numero);
		}
	}
	public static String formatearFechaHM(Date fecha) throws ParseException {
		if(fecha == null) {
			return "";
		} else {
			return new SimpleDateFormat(ConstantsWeb.PATRON_FECHA_HM).format(fecha);
		}
	}
	public static String formatearFechaHMS(Date fecha) throws ParseException {
		if(fecha == null) {
			return "";
		} else {
			return new SimpleDateFormat(ConstantsWeb.PATRON_FECHA_HMS).format(fecha);
		}
	}

	public static Integer fechasDiferenciaEnDias(Date fechaInicial, Date fechaFinal) {
		DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM);
		String fechaInicioString = df.format(fechaInicial);
		try {
			fechaInicial = df.parse(fechaInicioString);
		} catch (ParseException ex) {
		}

		String fechaFinalString = df.format(fechaFinal);
		try {
			fechaFinal = df.parse(fechaFinalString);
		} catch (ParseException ex) {
		}

		long fechaInicialMs = fechaInicial.getTime();
		long fechaFinalMs = fechaFinal.getTime();
		long diferencia = fechaFinalMs - fechaInicialMs;
		int dias = (int) Math.abs(Math.floor(diferencia / (1000 * 60 * 60 * 24)));
		return Integer.valueOf(dias);
	}

	public static double fechasDiferenciaEnMinutos(Date fechaInicial, Date fechaFinal) {
		if(fechaInicial == null || fechaFinal == null) {
			return 0;
		}
		
		long fechaInicialMs = fechaInicial.getTime();
		long fechaFinalMs   = fechaFinal.getTime();
		long diferencia     = fechaFinalMs - fechaInicialMs;
		
		double dias = (double) Math.abs(Math.floor(diferencia / (1000.0 * 60.0)));
		
		return dias;
	}
	public static String isNull(String objeto,String valorVerdadero,String valorFalso){
		if(objeto==null) return valorVerdadero;
		else return valorFalso;
	}
	public static Object isNull(Object objeto,Object valorVerdadero,Object valorFalso){
		if(objeto==null) return valorVerdadero;
		else return valorFalso;
	}
	public static Object fromAjax(HttpServletRequest request,Class clase)throws Exception{
	    Object pojo =null;
	    
		pojo = clase.newInstance();//Class.forName(clase.getName());
		
		Field campos[]=pojo.getClass().getDeclaredFields();
		for(int i=0;i<campos.length;i++){
		    String nombreCampo=campos[i].getName();
		    Object valor=request.getParameter(nombreCampo);
		    campos[i].setAccessible(true);
		    String tipoDato=campos[i].getType().getName();
		    try{
		    if(tipoDato == "java.lang.String"){
			campos[i].set(pojo,String.valueOf(valor));
		    }
		    else if(tipoDato == "java.lang.Boolean"){		    	
		    	campos[i].set(pojo,Boolean.valueOf(""+valor));		    	
		    }
		    else if(tipoDato == "boolean"){
		    	try
		    	{
		    		if(valor.equals("1"))
		    			campos[i].set(pojo,true);
		    		else
		    			campos[i].set(pojo,false);
		    	}
		    	catch (Exception e) {		    	
			    	campos[i].set(pojo,false);
			    	e.printStackTrace();
				}
		    }
		    else if(tipoDato == "java.lang.Integer"){		    	
		    	campos[i].set(pojo,Integer.parseInt(""+valor));		    	
		    }
		    else if(tipoDato == "java.lang.Double"){
			campos[i].set(pojo,Double.parseDouble(""+valor));
		    }
		    else if(tipoDato == "double"){
		    	try
		    	{	campos[i].set(pojo,Double.parseDouble(""+valor));}
		    	catch (Exception e) {		    	
			    	campos[i].set(pojo,0.0);
			    	e.printStackTrace();
				}
			    }
		    else  if(tipoDato == "java.util.Date"){
			campos[i].set(pojo,getDate(""+valor, "dd/MM/YYYY"));
		    }
		    }catch (Exception e) {		    	
		    	campos[i].set(pojo,null);
		    	e.printStackTrace();
			}
			
		    campos[i].setAccessible(false);
		}
	    
	    return pojo;
	}
	
	public static String formatStringLEFT(String value, int size, char caracter){
		StringBuilder newvalue = null;
		if(value != null){
			newvalue = new StringBuilder(value);
			if(size > value.length()){
				for(int i=0; i<size - value.length(); i++){
					newvalue.append(caracter);
				}
				return newvalue.toString().toUpperCase();
			}else{
				return value.substring(0,size).toUpperCase();
			}
		}else{
			newvalue = new StringBuilder();
			for(int i=0; i<size; i++){
				newvalue.append(caracter);
			}
			return newvalue.toString().toUpperCase();
		}
	}
	
	public static String formatStringRIGHT(String value, int size, char caracter){
		StringBuilder newvalue = null;
		if(value != null){
			newvalue = new StringBuilder();
			if(size > value.length()){
				for(int i=0; i<size - value.length(); i++){
					newvalue.append(caracter);
				}
				return newvalue.append(value).toString().toUpperCase();
			}else{
				return value.substring(0,size).toUpperCase();
			}
		}else{
			newvalue = new StringBuilder();
			for(int i=0; i<size; i++){
				newvalue.append(caracter);
			}
			return newvalue.toString().toUpperCase();
		}
	}
	
	public static void setAttribute(HttpServletRequest request,Map<String,Object> parameters){
		Set<String> keys=parameters.keySet();
		Iterator<String> iKeys=keys.iterator();
		////System.out.println("==================");
		while(iKeys.hasNext()){
			String key=iKeys.next();
			request.setAttribute(key, parameters.get(key));
			
			//System.out.println("{"+key+"="+parameters.get(key)+"}");
		}
		////System.out.println("==================");
	}
	
	public static void getParameter(Map<String,Object> parameters){
		Set<String> keys=parameters.keySet();
		Iterator<String> iKeys=keys.iterator();
		////System.out.println("========INICIO==========");
		while(iKeys.hasNext()){
			String key=iKeys.next();			
			//System.out.println("{"+key+"="+parameters.get(key)+"}");
		}
		////System.out.println("========FIN==========");
	}
	public static String formatStringCENTER(String value, int size, char caracter){
		StringBuilder newvalue = null;
		if(value != null){
			newvalue = new StringBuilder();
			if(size > value.length()){
				for(int i=0; i<(size - value.length())/2; i++){
					newvalue.append(caracter);
				}
				newvalue.append(value);
				for(int i=newvalue.length(); i<size; i++){
					newvalue.append(caracter);
				}
				return newvalue.toString().toUpperCase();
			}else{
				return value.substring(0,size).toUpperCase();
			}
		}else{
			newvalue = new StringBuilder();
			for(int i=0; i<size; i++){
				newvalue.append(caracter);
			}
			return newvalue.toString().toUpperCase();
		}
	}
	
	public static String formatearNumeros(Double numero, String patron, Locale locale){
		String numTemp = null;
		if(numero!=null){
			NumberFormat formato= NumberFormat.getInstance(locale);
			DecimalFormat saldo = (DecimalFormat)formato;
			saldo.applyPattern(patron);
			numTemp = saldo.format(numero);
		}
		return numTemp;
	}
}